#include "GY_NStyle.h"
#include <QDebug>
#include <QPushButton>
#include <QToolButton>

GY_NStyle::GY_NStyle(QWidget *w)
{
    this->targetWidget = w;
}

/**
 * @brief NStyle::addClass 追加指定类名样式
 * @param className
 */
GY_NStyle* GY_NStyle::addClass(const QString &className)
{
    if(!m_classList.contains(className)){
        m_classList.append(className);
        this->targetWidget->setProperty("class",m_classList.join(" "));
        updateStyle();
    }
    return this;
}
/**
 * @brief NStyle::removeClass 移除指定类名样式
 * @param className
 */
GY_NStyle* GY_NStyle::removeClass(const QString &className)
{
    if(m_classList.contains(className)){
        m_classList.removeOne(className);
        this->targetWidget->setProperty("class",m_classList.join(" "));
        updateStyle();
    }
    return this;
}
/**
 * @brief NStyle::setClass 设置当前控件样式为指定类名样式，（先移除原有的样式，使用当前类样式设置）
 * @param className
 */
GY_NStyle* GY_NStyle::setClass(const QString &className)
{
    m_classList.clear();
    m_classList.append(className);
    this->targetWidget->setProperty("class",m_classList.join(" "));
    updateStyle();
    return this;
}
/**
 * @brief NStyle::clearClass 移除所有样式
 */
GY_NStyle* GY_NStyle::clearClass()
{
    m_classList.clear();
    this->targetWidget->setProperty("class",m_classList.join(" "));
    updateStyle();
    return this;
}
/**
 * @brief NStyle::setStyleProperty 设置行内样式，具有最高优先级，会覆盖之前的同属性样式。 如color:red
 * @param propertyName
 * @param style
 */
GY_NStyle* GY_NStyle::setStyleProperty(const QString &propertyName, const QString &style)
{
    //将代码样式添加到集合中，注，如果有重复属性的样式设置则后面会覆盖前面的属性值
    m_propertyValueMap.insert(propertyName.trimmed(),style.trimmed());
    //自定义样式规则 /*#*/background-color:red;border:none;/*#*/  , 由特殊符号/*#*/进行区分，中间部分则为代码设置的样式
    //该部分样式会追加到现有样式之后 ，如控件已设置了样式  color:red;  则添加代码属性样式background-color:red 后的完整样式为 ：  color:red;/*#*/background-color:red;/*#*/
    //获取现有样式，并将代码样式去除
    QRegExp rx("/\\*#\\*/.*/\\*#\\*/");
    QString _oldStyle = this->targetWidget->styleSheet();
    _oldStyle = _oldStyle.replace(rx,"");
    //将新的代码样式组成特定样式字符串，由/*#*/进行区分
    QMapIterator<QString,QString> _map(m_propertyValueMap);
    QString _newStyle="/*#*/";
    while(_map.hasNext()){
        _map.next();
        _newStyle.append(QString("%1:%2;").arg(_map.key()).arg(_map.value()));
    }
    _newStyle.append("/*#*/");
    //将样式进行组合
    this->targetWidget->setStyleSheet(QString("%1;%2").arg(_oldStyle).arg(_newStyle));
    updateStyle();
    return this;
}
/**
 * @brief NStyle::setValueStyle 根据值改变样式与setValue配合使用，当取值为xx时采用xx对应设置的类样式名称
 * @param value
 * @param className
 */
GY_NStyle* GY_NStyle::setValueStyle(const QVariant &value, const QString &className , const QString &iconPath)
{
    m_valueMap.insert(value,className);
    if(!iconPath.isEmpty()){
        m_iconMap.insert(value,QIcon(iconPath));
    }
    return this;
}
/**
 * @brief NStyle::setValue 设置控件值,与setValueStyle配合使用，当取值为xx时采用xx对应设置的类样式名称
 * @param value
 */
GY_NStyle* GY_NStyle::setNValue(const QVariant &value)
{
    m_currentValue = value;
    if(m_valueMap.contains(value)){
        setClass( m_valueMap.value(m_currentValue) );
    }
    if(m_iconMap.contains(value)){
        QString cName = this->targetWidget->metaObject()->className();
        if(cName == "NPushButton" || cName == "QPushButton"){
            QPushButton *btn = qobject_cast<QPushButton*>(this->targetWidget);
            btn->setIcon(m_iconMap.value(value));
        }else if(cName == "NToolButton" || cName == "QToolButton"){
            QToolButton *btn = qobject_cast<QToolButton*>(this->targetWidget);
            btn->setIcon(m_iconMap.value(value));
        }
    }
    return this;
}
/**
 * @brief NStyle::updateStyle 刷新当前控件样式
 */
GY_NStyle* GY_NStyle::updateStyle()
{
    this->targetWidget->setStyle(this->targetWidget->style());
    return this;
}
/**
 * @brief NIcon::setValueIcon 设置值对应的图标
 * @param key
 * @param icon
 */
GY_NStyle* GY_NStyle::setValueIcon(const QVariant &key, const QString &icon)
{
    setValueIcon(key,QIcon(icon));
    return this;
}

/**
 * @brief NIcon::setValueIcon 设置值对应的图标
 * @param key
 * @param icon
 */
GY_NStyle* GY_NStyle::setValueIcon(const QVariant &key, const QIcon &icon)
{
    this->m_iconMap.insert(key,icon);
    return this;
}
